"""
通过对象.属性赋值的方式 十分不安全，要实现安全，需要封装属性。
    和java的封装一样。java实现private关键字 提供Public方法
    python也是封装属性，提供get/set方法，但是python没有private关键字，可以将名字设置为参数不一样的值
"""


class Cat():

    def __init__(self, name, age, sex, height):
        """
        封装属性为hidden_name 在init方法时赋值
        """
        self.hidden_name = name
        self.hidden_age = age
        self.hidden_sex = sex
        self.hidden_height = height

    # 将name和age两个属性暴露出去 给别人查看和修改
    def get_name(self):
        return self.hidden_name

    def set_name(self, name):
        self.hidden_name = name

    def set_age(self, age):
        self.hidden_age = age

    def get_age(self):
        return self.hidden_age


cat = Cat("bob", 12, "男", 117)
# 直接读取sex 由于没有属性，存的是hidden_sex 读取会报错
# print(cat.sex)
print(cat.get_name())
cat.set_age(4444)
print(cat.get_age())

"""
类中的属性都可以用_name来表示隐藏的属性
property装饰器，可以用来装饰属性，像调用属性一样使用get方法
setter装饰器，可以用来装饰属性,可以调用属性的set方法
注意 setter装饰器必须建立在property装饰器之后。有读才有写-  @name.setter
"""


class Dog():
    def __init__(self, name, age, sex):
        self._name = name
        self._age = age
        self._sex = sex


    @property
    def name(self):
        return self._name

    @name.setter
    def name(self,name):
        print("setter装饰器使用")
        self._name=name


dog = Dog("bob",12,"男")
print(dog.name)
dog.name='李四'
print(dog.name)